package com.hua.controller;


import com.hua.pojo.Comment;
import com.hua.pojo.User;
import com.hua.service.CommentService;
import com.hua.utils.CanteenCommentDTO;
import com.hua.utils.HandleTokenUtils;
import com.hua.utils.JwtUtils;
import com.hua.utils.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author hua
 * @since 2023-12-24
 */
@Api(tags = "评论管理")
@Slf4j
@RestController
@RequestMapping("/comment")
public class CommentController {



    @Autowired
    private CommentService commentService;
    @Autowired//处理jwt是否有效
    private HandleTokenUtils handleTokenUtils;
    @Autowired//解析jwt
    private JwtUtils jwtUtils;



    @ApiOperation("菜品详情页-菜品评论API")
    @PostMapping("/getCommentList")
    public Result getCommentList(@RequestBody Map<String, Object> requestData){

        Integer foodId = (Integer) requestData.get("foodId");//菜品id
        Integer pageSize = (Integer) requestData.get("pageSize");//显示多少条数据
        Integer pageNo = (Integer) requestData.get("pageNo");//显示第几页数据


        log.info("foodId:"+foodId);
        log.info("pageSize:"+pageSize);
        log.info("pageNo:"+pageNo);




//        /**
//         * 处理token
//         */
//        //判断jwt是否还有效
//        boolean b = handleTokenUtils.checkJWTIsLost(token, User.class);
//        if(!b){//登录失效
//            return Result.loginFailure();
//        }

        //登录有效
        //执行查询
        Map<String, Object> CommentList = commentService.getCommentList(foodId,pageSize,pageNo);

        return Result.success(CommentList,"获取评论信息成功！");
    }




    //新增评论
    @ApiOperation("用户端-用户评论API")
    @PostMapping("/addComment")
    public Result addComment(@RequestBody Map<String, Object> requestData){

        String token=(String) requestData.get("token");
        int foodId = (int) requestData.get("foodId");
        int rating = (int) requestData.get("rating");//打分
        String commentText=(String) requestData.get("commentDetail");//评论内容





        /**
         * 处理token
         */
        //判断jwt是否还有效
        boolean b = handleTokenUtils.checkJWTIsLost(token, User.class);
        if(!b){//登录失效
            return Result.loginFailure();
        }
        //解析token到user对象
        User user = jwtUtils.parseToken(token, User.class);

        //封装对象
        Comment newComment=new Comment();
        newComment.setUserId(user.getId());
        newComment.setFoodId(foodId);
        newComment.setRating(rating);
        newComment.setCommentText(commentText);

        /**
         * 这里对服务处的抛出的异常做处理，因为服务处做了异常时发生事务回滚
         * */
        try {
            // 登录有效
            int i = commentService.addComment(newComment);

            if (i == 1) {
                return Result.success("评论成功！");
            } else {
                return Result.fail("系统似乎出了点小问题~请稍后再试~");
            }
        } catch (Exception e) { // 或捕获特定类型的异常，如 CustomServiceException
            log.error("添加评论时发生异常: ", e); // 记录异常日志

            // 根据实际情况，返回适合的错误信息
            String errorMessage = "系统出错，请联系管理员！";
            return Result.fail(errorMessage); // 返回异常对应的失败结果
        }

    }



    //用户评论自主删除（用户端）
    //分两步：①先判断该评论是否是该用户           ②是的话，进行删除
    @ApiOperation("用户端-用户删除评论API")
    @PostMapping("/deleteCommentByCommentId")
    public Result deleteCommentByCommentId(@RequestBody Map<String, Object> requestData){

        String token=(String) requestData.get("token");
        int commentID = (int) requestData.get("commentID");





        /**
         * 处理token
         */
        //判断jwt是否还有效
        boolean b = handleTokenUtils.checkJWTIsLost(token, User.class);
        if(!b){//登录失效
            return Result.loginFailure();
        }

        //解析token到user对象
        User user = jwtUtils.parseToken(token, User.class);
        try {
            int i;

            if (user.getPermission() == 2) { // 总管理员就放行，无限制删除
                i = commentService.deleteComment(commentID);
            } else { // 其它用户
                i = commentService.deleteCommentByCommentId(commentID, user.getId());
            }

            // 判断删除结果
            if (i == 1) {
                return Result.success("删除评论成功！");
            } else if (i == 0) {
                return Result.fail("权限不足或者评论已删除~");
            } else {
                return Result.fail("系统似乎出了点小问题~请稍后再试~");
            }
        } catch (Exception e) {
            log.error("删除评论时发生异常: ", e); // 记录异常日志

            String errorMessage = "系统出错，请联系管理员！";
            return Result.fail(errorMessage); // 返回异常对应的失败结果
        }

    }



    //管理员选择某评论是否展示
    //传输的值是1就是展示，0就是不展示
    @ApiOperation("管理员选择某评论是否展示")
    @PostMapping("/commentIsShow")
    public Result commentIsShow(@RequestBody Map<String, Object> requestData) {

        String token = (String) requestData.get("token");
        int commentID = (int) requestData.get("commentID");
        int isShow = (int) requestData.get("isShow");



        /**
         * 处理token
         */
        //判断jwt是否还有效
        boolean b = handleTokenUtils.checkJWTIsLost(token, User.class);
        if (!b) {//登录失效
            return Result.loginFailure();
        }

        //解析token到user对象
        User user = jwtUtils.parseToken(token, User.class);
        Integer permission = user.getPermission();//得到权限

        //权限处理
        if(permission==1){//普通用户
            return Result.fail("普通用户无权执行该操作！");
        }else{
            int i = commentService.commentIsShow(commentID, isShow);
            if(i==1){
                return Result.success("修改成功！");
            }else{
                return Result.fail("系统出了点小问题~请稍后再试！");
            }
        }
    }


    //用户评论汇总(用户端)，查询用户所有的评论，返回：菜名、饭堂、打分、评论内容、评论时间、是否展示
    @ApiOperation("获取该用户所有的评论")
    @PostMapping("/userAllComment")
    public Result userAllComment(@RequestBody Map<String, Object> requestData) {

        String token = (String) requestData.get("token");

        /**
         * 处理token
         */
        //判断jwt是否还有效
        boolean b = handleTokenUtils.checkJWTIsLost(token, User.class);
        if (!b) {//登录失效
            return Result.loginFailure();
        }

        //解析token到user对象
        User user = jwtUtils.parseToken(token, User.class);

        log.info("用户id:"+user.getId());

        //多表查询
        Map<String, Object> userCommentList = commentService.userAllComment(user.getId());
        return Result.success(userCommentList,"获取该用户所有评论信息成功！");

    }



    //根据饭堂id显示该饭堂所有的评论
    //查询某个饭堂所有菜品的评论，返回：评论者的网名、菜名、打分、评论内容、评论时间、是否展示
    @ApiOperation("根据饭堂id显示该饭堂所有的评论")
    @PostMapping("/sthCanteenAllComment")
    public Result sthCanteenAllComment(@RequestBody Map<String, Object> requestData) {

        String token = (String) requestData.get("token");
        int canteenID=(int) requestData.get("canteenID");

        /**
         * 处理token
         */
        //判断jwt是否还有效
        boolean b = handleTokenUtils.checkJWTIsLost(token, User.class);
        if (!b) {//登录失效
            return Result.loginFailure();
        }


        log.info("饭堂id:"+canteenID);


        //多表查询
        Map<String, Object> userCommentList = commentService.sthCanteenAllComment(canteenID);
        log.info("暂无评论："+userCommentList);
        log.info("分离后："+userCommentList.get("data"));

        List<CanteenCommentDTO> userCommentData = (List<CanteenCommentDTO>) userCommentList.get("data");
        if (userCommentData.isEmpty()) {
            return Result.success(null, "暂无评论！");
        }

        return Result.success(userCommentList,"获取该饭堂所有评论信息成功！");

    }



}

